/**
 * 7. 整数反转
 *
 * 给出一个 32 位的有符号整数，你需要将这个整数中每位上的数字进行反转。
 *
 * 示例 1:
 *
 * 输入: 123
 * 输出: 321
 *
 *  示例 2:
 *
 * 输入: -123
 * 输出: -321
 *
 * 示例 3:
 *
 * 输入: 120
 * 输出: 21
 */
public class Solution {
    public static void main(String[] args) {
        System.out.println(Integer.MAX_VALUE);
    }

    //..........
    public static int reverse(int x) {

        // 可以+""转换成字符串吗??? 然后
        String xs = x+"";
        //如果长度0/1 直接返回

        //如果有符号先剔除

        char[] chars = xs.toCharArray();
        char[] last = new char[xs.length()];
        //遍历反转赋值 仅当第一个不为0的时候 开始赋值
        int i = 1;
        while(chars[chars.length-i]!=0){}

            return Integer.valueOf(xs);

    }


    /*
    方法：弹出和推入数字 & 溢出前进行检查

思路

我们可以一次构建反转整数的一位数字。在这样做的时候，我们可以预先检查向原整数附加另一位数字是否会导致溢出。

算法

反转整数的方法可以与反转字符串进行类比。

我们想重复“弹出” xxx 的最后一位数字，并将它“推入”到 rev\text{rev}rev 的后面。最后，rev\text{rev}rev 将与 xxx 相反。

要在没有辅助堆栈 / 数组的帮助下 “弹出” 和 “推入” 数字，我们可以使用数学方法。

//pop operation:
pop = x % 10;
x /= 10;

//push operation:
temp = rev * 10 + pop;
rev = temp;

但是，这种方法很危险，因为当 temp=rev⋅10+pop\text{temp} = \text{rev} \cdot 10 + \text{pop}temp=rev⋅10+pop 时会导致溢出。

幸运的是，事先检查这个语句是否会导致溢出很容易。

为了便于解释，我们假设 rev\text{rev}rev 是正数。

    如果 temp=rev⋅10+poptemp = \text{rev} \cdot 10 + \text{pop}temp=rev⋅10+pop 导致溢出，那么一定有 rev≥INTMAX10\text{rev} \geq \frac{INTMAX}{10}rev≥10INTMAX​。
    如果 rev>INTMAX10\text{rev} > \frac{INTMAX}{10}rev>10INTMAX​，那么 temp=rev⋅10+poptemp = \text{rev} \cdot 10 + \text{pop}temp=rev⋅10+pop 一定会溢出。
    如果 rev==INTMAX10\text{rev} == \frac{INTMAX}{10}rev==10INTMAX​，那么只要 pop>7\text{pop} > 7pop>7，temp=rev⋅10+poptemp = \text{rev} \cdot 10 + \text{pop}temp=rev⋅10+pop 就会溢出。

当 rev\text{rev}rev 为负时可以应用类似的逻辑。

class Solution {
    public int reverse(int x) {
        int rev = 0;
        while (x != 0) {
            int pop = x % 10;
            x /= 10;
            if (rev > Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE / 10 && pop > 7)) return 0;
            if (rev < Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE / 10 && pop < -8)) return 0;
            rev = rev * 10 + pop;
        }
        return rev;
    }
}

复杂度分析

    时间复杂度：O(log⁡(x))O(\log(x))O(log(x))，xxx 中大约有 log⁡10(x)\log_{10}(x)log10​(x) 位数字。
    空间复杂度：O(1)O(1)O(1)。

     */
}
